package com.cencat.user.enums;

/**
 * 用户类型枚举
 * @author cencat
 * @since 2024-01-01
 */
public enum UserType {
    
    /**
     * 超级管理员
     */
    SUPER_ADMIN("SUPER_ADMIN", "超级管理员"),
    
    /**
     * 系统管理员
     */
    SYSTEM_ADMIN("SYSTEM_ADMIN", "系统管理员"),
    
    /**
     * 租户管理员
     */
    TENANT_ADMIN("TENANT_ADMIN", "租户管理员"),
    
    /**
     * 部门管理员
     */
    DEPT_ADMIN("DEPT_ADMIN", "部门管理员"),
    
    /**
     * 普通用户
     */
    NORMAL("NORMAL", "普通用户"),
    
    /**
     * 访客用户
     */
    GUEST("GUEST", "访客用户"),
    
    /**
     * 外部用户
     */
    EXTERNAL("EXTERNAL", "外部用户"),
    
    /**
     * 服务账户
     */
    SERVICE("SERVICE", "服务账户"),
    
    /**
     * API用户
     */
    API_USER("API_USER", "API用户");
    
    private final String code;
    private final String description;
    
    UserType(String code, String description) {
        this.code = code;
        this.description = description;
    }
    
    public String getCode() {
        return code;
    }
    
    public String getDescription() {
        return description;
    }
    
    /**
     * 根据代码获取枚举
     * @param code 类型代码
     * @return 用户类型枚举
     */
    public static UserType fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return null;
        }
        
        for (UserType type : UserType.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        
        throw new IllegalArgumentException("未知的用户类型代码: " + code);
    }
    
    /**
     * 是否为管理员类型
     * @return 是否为管理员
     */
    public boolean isAdmin() {
        return this == SUPER_ADMIN || this == SYSTEM_ADMIN || 
               this == TENANT_ADMIN || this == DEPT_ADMIN;
    }
    
    /**
     * 是否为超级管理员
     * @return 是否为超级管理员
     */
    public boolean isSuperAdmin() {
        return this == SUPER_ADMIN;
    }
    
    /**
     * 是否为系统管理员
     * @return 是否为系统管理员
     */
    public boolean isSystemAdmin() {
        return this == SYSTEM_ADMIN;
    }
    
    /**
     * 是否为租户管理员
     * @return 是否为租户管理员
     */
    public boolean isTenantAdmin() {
        return this == TENANT_ADMIN;
    }
    
    /**
     * 是否为部门管理员
     * @return 是否为部门管理员
     */
    public boolean isDeptAdmin() {
        return this == DEPT_ADMIN;
    }
    
    /**
     * 是否为普通用户
     * @return 是否为普通用户
     */
    public boolean isNormal() {
        return this == NORMAL;
    }
    
    /**
     * 是否为访客用户
     * @return 是否为访客用户
     */
    public boolean isGuest() {
        return this == GUEST;
    }
    
    /**
     * 是否为外部用户
     * @return 是否为外部用户
     */
    public boolean isExternal() {
        return this == EXTERNAL;
    }
    
    /**
     * 是否为服务账户
     * @return 是否为服务账户
     */
    public boolean isService() {
        return this == SERVICE;
    }
    
    /**
     * 是否为API用户
     * @return 是否为API用户
     */
    public boolean isApiUser() {
        return this == API_USER;
    }
    
    /**
     * 是否有管理权限
     * @return 是否有管理权限
     */
    public boolean hasAdminPermission() {
        return isAdmin();
    }
    
    /**
     * 获取权限级别
     * @return 权限级别（数字越大权限越高）
     */
    public int getPermissionLevel() {
        switch (this) {
            case SUPER_ADMIN:
                return 100;
            case SYSTEM_ADMIN:
                return 90;
            case TENANT_ADMIN:
                return 80;
            case DEPT_ADMIN:
                return 70;
            case NORMAL:
                return 50;
            case EXTERNAL:
                return 30;
            case GUEST:
                return 20;
            case API_USER:
                return 10;
            case SERVICE:
                return 5;
            default:
                return 0;
        }
    }
    
    /**
     * 是否有更高权限
     * @param other 其他用户类型
     * @return 是否有更高权限
     */
    public boolean hasHigherPermissionThan(UserType other) {
        return this.getPermissionLevel() > other.getPermissionLevel();
    }
    
    /**
     * 是否有相同或更高权限
     * @param other 其他用户类型
     * @return 是否有相同或更高权限
     */
    public boolean hasEqualOrHigherPermissionThan(UserType other) {
        return this.getPermissionLevel() >= other.getPermissionLevel();
    }
}